package com.echo.im.common.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @author: echo
 * @time: 2024-08-23
 */
public class GenericTypeUtil {


    /**
     * 获取类实现的接口的第一个泛型参数类型。
     *
     * @param clazz          实现了某个接口的类
     * @param interfaceClass 接口类
     * @return 第一个泛型参数的Class对象，如果找不到则返回null
     */
    public static <T> Class<T> getFirstGenericTypeOfInterface(Class<?> clazz, Class<?> interfaceClass) {
        // 获取实现的接口类型
        Type[] genericInterfaces = clazz.getGenericInterfaces();

        for (Type genericInterface : genericInterfaces) {
            // 判断是否是目标接口
            if (genericInterface instanceof ParameterizedType parameterizedType && parameterizedType.getRawType() == interfaceClass) {
                // 获取第一个泛型参数
                Type actualType = parameterizedType.getActualTypeArguments()[0];

                if (actualType instanceof Class<?>) {
                    return (Class<T>) actualType;
                }
            }
        }

        return null;
    }

    /**
     * 获取类继承的抽象类的第一个泛型参数类型。
     *
     * @param clazz 继承了某个抽象类的类
     * @return 第一个泛型参数的Class对象，如果找不到则返回null
     */
    public static <T> Class<T> getFirstGenericTypeOfAbstractClass(Class<?> clazz) {
        // 获取直接父类类型
        Type genericSuperclass = clazz.getGenericSuperclass();

        if (genericSuperclass instanceof ParameterizedType parameterizedType) {

            // 获取第一个泛型参数
            Type actualType = parameterizedType.getActualTypeArguments()[0];

            if (actualType instanceof Class<?>) {
                return (Class<T>) actualType;
            }
        }

        return null;
    }

}
